﻿
using CsvHelper.Configuration.Attributes;
using LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
using Microsoft.Extensions.DependencyInjection;
using Prism.DryIoc;
using Prism.Events;
using Prism.Ioc;
using Prism.Regions;
using Prism.Services.Dialogs;
using SkiaSharp;
using System.Configuration;
using System.Data;
using System.Runtime.CompilerServices;
using System.Windows;
using 基于WPF的电缆采样数据分析系统.Models;
using 基于WPF的电缆采样数据分析系统.Models.Dbs;
using 基于WPF的电缆采样数据分析系统.Models.Enums;
using 基于WPF的电缆采样数据分析系统.Models.Task;
using 基于WPF的电缆采样数据分析系统.Service;
using 基于WPF的电缆采样数据分析系统.Tools.LangugeTool;
using 基于WPF的电缆采样数据分析系统.ViewModels;
using 基于WPF的电缆采样数据分析系统.ViewModels.CommonComponent;
using 基于WPF的电缆采样数据分析系统.ViewModels.DeviceStatus;
using 基于WPF的电缆采样数据分析系统.ViewModels.Settings;
using 基于WPF的电缆采样数据分析系统.ViewModels.TDRWork;
using 基于WPF的电缆采样数据分析系统.ViewModels.TDRWork.MenuPage;
using 基于WPF的电缆采样数据分析系统.ViewModels.TDRWork.TaskPage;
using 基于WPF的电缆采样数据分析系统.ViewModels.Users;
using 基于WPF的电缆采样数据分析系统.Views;
using 基于WPF的电缆采样数据分析系统.Views.CommonComponent;
using 基于WPF的电缆采样数据分析系统.Views.DeviceStatus;
using 基于WPF的电缆采样数据分析系统.Views.Settings;
using 基于WPF的电缆采样数据分析系统.Views.TDRWork;
using 基于WPF的电缆采样数据分析系统.Views.TDRWork.MenuPage;
using 基于WPF的电缆采样数据分析系统.Views.TDRWork.TaskPage;
using 基于WPF的电缆采样数据分析系统.Views.Users;

namespace 基于WPF的电缆采样数据分析系统
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        
        /// <summary>
        /// 三个通道的集合波形数据
        /// </summary>
        public static List<PassageDataInfo> ChannelDataList { get; set; }

        

        /// <summary>
        /// 获取依赖注入的对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T GetService<T>()
        {
            return ((T)(App.Current as PrismApplication).Container.GetContainer().GetService<T>());
        }

        /// <summary>
        /// 对话框服务
        /// </summary>
        public DialogHostService DialogHostService { get; set; }


        /// <summary>
        /// 构造器
        /// </summary>
        public App()
        {
            // 初始化通道数据集合
            InitChannelDataList();
        }

        /// <summary>
        /// 设置启动页
        /// </summary>
        /// <returns></returns>
        protected override Window CreateShell()
        {
            
            return Container.Resolve<MainWin>();
        }

        /// <summary>
        /// 依赖注入
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            // 自定义对话框服务
            containerRegistry.RegisterSingleton<DialogHostService>();
            containerRegistry.RegisterSingleton<TaskPageUCViewModel>();
            containerRegistry.RegisterSingleton<LogPageUCViewModel>();

            // 数据库
            containerRegistry.RegisterSingleton<TDRDbContext>();

            // 发布订阅
            containerRegistry.RegisterSingleton<EventAggregator>();

            // 登录
            containerRegistry.RegisterDialog<LoginUC, LoginUCViewModel>();

            // 通道页面
            containerRegistry.RegisterForNavigation<PassagePageUCViewModel>();

            // 主窗口
            containerRegistry.RegisterSingleton<MainWinViewModel>();
            // 区域
            containerRegistry.RegisterSingleton<RegionManager>();
            // 导航
            containerRegistry.RegisterSingleton<RegionNavigationJournal>();
            // 发布订阅
            containerRegistry.RegisterSingleton<EventAggregator>();

            // 导航页
            containerRegistry.RegisterForNavigation<TDRWorkUC, TDRWorkUCViewModel>(); // TDR工作区
            containerRegistry.RegisterForNavigation<DeviceStatusUC, DeviceStatusUCViewModel>(); // 设备状态区
            containerRegistry.RegisterForNavigation<AbnormalAlarmUC, AbnormalAlarmUCViewModel>(); // 异常报警区
            containerRegistry.RegisterForNavigation<AccountingReportUC, AccountingReportUCViewModel>();  // 报表分析区
            containerRegistry.RegisterForNavigation<HistoricalDataUC, HistoricalDataUCViewModel>(); // 历史数据区
            containerRegistry.RegisterForNavigation<SettingsUC, SettingsUCViewModel>(); // 系统设置区

            // 设置页面导航页
            containerRegistry.RegisterForNavigation<PersonalUC, PersonalUCViewModel>(); // 个性化
            containerRegistry.RegisterForNavigation<SysSetUC>(); // 系统
            containerRegistry.RegisterForNavigation<AboutUsUC>(); // 系统设置

            // 公共
            // 设置计算器页面
            containerRegistry.RegisterForNavigation<CalculatorUC, CalculatorUCViewModel>();

            // 常用
            // 设置导入波形文件配置页面
            containerRegistry.RegisterForNavigation<EditImportWavformChannelUC, EditImportWavformChannelUCViewModel>();
            // 设置通道状态页面
            containerRegistry.RegisterForNavigation<ChannelStatusUC, ChannelStatusUCViewModel>();
            // 设置单次测试页面
            containerRegistry.RegisterForNavigation<SingleTestUC, SingleTestUCViewModel>();

            // 工程
            // 设置新建工程页面
            containerRegistry.RegisterForNavigation<CreateProjectUC, CreateProjectUCViewModel>();
            // 配置导入导出页面
            containerRegistry.RegisterForNavigation<ImportAndExportUC, ImportAndExportUCViewModel>();
            // 配置最近使用
            containerRegistry.RegisterForNavigation<RecentUsedFileUC, RecentUsedFileUCViewModel>();

            // 任务
            // 设置新建或修改任务页面
            containerRegistry.RegisterForNavigation<TaskPageInfoUC, TaskPageInfoUCViewModel>();
            // 配置删除任务页面 
            containerRegistry.RegisterForNavigation<DeleteTaskUC, DeleteTaskUCViewModel>();
            
            // 日志
            // 配置打印预览页面
            containerRegistry.RegisterForNavigation<PreviewPrintUC, PreviewPrintUCViewModel>();

            // 波形
            // 配置坐标范围页面
            containerRegistry.RegisterForNavigation<CoordinateRangeUC, CoordinateRangeUCViewModel>();
            // 配置导出波形页面
            containerRegistry.RegisterForNavigation<ExportWavformUC, ExportWavformUCViewModel>();
            // 配置保存参考波形页面
            containerRegistry.RegisterForNavigation<SaveReferenceWaveformUC, SaveReferenceWaveformUCViewModel>();

            // 工具
            // 配置选项页面
            containerRegistry.RegisterForNavigation<OptionUC, OptionUCViewModel>();
            // 配置调试页面
            containerRegistry.RegisterForNavigation<DebugUC, DebugUCViewModel>();
            // 配置测试定义页面
            containerRegistry.RegisterForNavigation<TestDefineUC, TestDefineUCViewModel>();

            // 菜单栏
            // 配置删除页面
            containerRegistry.RegisterForNavigation<DeletePageUC, DeletePageUCViewModel>();
            // 配置选择显示列页面
            containerRegistry.RegisterForNavigation<SelectTheColumnsToDisplayUC, SelectTheColumnsToDisplayUCViewModel>();

            // 设备状态页面
            containerRegistry.RegisterForNavigation<DeviceStatusUC, DeviceStatusUCViewModel>();
            containerRegistry.RegisterForNavigation<TimeRegionUC, TimeRegionUCViewModel>();
            containerRegistry.RegisterForNavigation<ColumnOneUC, ColumnOneUCViewModel>();
            containerRegistry.RegisterForNavigation<ColumnTwoUC, ColumnTwoUCViewModel>();
            containerRegistry.RegisterForNavigation<ColumnThreeUC, ColumnThreeUCViewModel>();


            // 设置修改用户页面
            containerRegistry.RegisterForNavigation<UpdateUserUC, UpdateUserUCViewModel>();
        }

        /// <summary>
        /// 初始化通道数据集合
        /// </summary>
        private void InitChannelDataList()
        {
            ChannelDataList = new List<PassageDataInfo>();
            ChannelDataList.Add(new PassageDataInfo() { Pid=0, PassageType=PassageType.ChannelOne});
            ChannelDataList.Add(new PassageDataInfo() { Pid=1, PassageType=PassageType.ChannelTwo});
            ChannelDataList.Add(new PassageDataInfo() { Pid=2, PassageType=PassageType.ChannelThree});
        }


        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            LiveCharts.Configure(config =>
                config.HasGlobalSKTypeface(SKFontManager.Default.MatchCharacter('汉')) // livecharts设置为中文
            );


        }


        /// <summary>
        /// 初始化
        /// </summary>
        protected override void OnInitialized()
        {

            var dialog = Container.Resolve<IDialogService>();
            dialog.ShowDialog("LoginUC", callback =>
            {
                // 未登录
                if (callback.Result != ButtonResult.OK)
                {
                    Environment.Exit(0);
                    return;
                }

                // 登录成功
                var mainVM = App.Current.MainWindow.DataContext as MainWinViewModel; // 主界面数据上下文


                if (mainVM != null)
                {
                    var RegionManager = App.GetService<IRegionManager>();
                    var Journal = App.GetService<IRegionNavigationJournal>();


                    RegionManager.Regions["MainViewRegion"].RequestNavigate("TDRWorkUC",
                    callback =>
                    {
                        Journal = callback.Context.NavigationService.Journal; // 记录足迹
                    });
                }
                base.OnInitialized();
            });
        }
    }

}
